﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<iostream>
using namespace std;

//int main()
//{
//    int a = 10;
//    int c = 20;
//    int& b = a;
//    b = c;
//    printf("%d %d %d \n", a, b, c);
//    printf("%p %p %p \n", &a, &b, &c);
//	return 0;
//}
//int main()
//{
//		const int a = 10;
//		//int& ra = a;   // 该语句编译时会出错，a为常量,这样会将权限扩大
//		const int& ra = a;
//		// int& b = 10; // 该语句编译时会出错，b为常量
//		const int& b = 10;
//		double d = 12.34;
//		//int& rd = d; // 该语句编译时会出错，类型不同
//		const int& rd = d;
//
//}
	//int& Add(int a, int b)
	//{
	//	int c = a + b;
	//	return c;
	//}
	//int main()
	//{
	//	int& ret = Add(1, 2);
	//	Add(3, 4);
	//	cout << "Add(1, 2) is :" << ret << endl;
	//	return 0;
	//}
//#include <time.h>
//struct A { int a[10000]; };
//A a;
//// 值返回
//A TestFunc1() { return a; }
//// 引用返回
//A& TestFunc2() { return a; }
//void TestReturnByRefOrValue()
//{
//	// 以值作为函数的返回值类型
//	size_t begin1 = clock();
//	for (size_t i = 0; i < 100000; ++i)
//		TestFunc1();
//	size_t end1 = clock();
//	// 以引用作为函数的返回值类型
//	size_t begin2 = clock();
//	for (size_t i = 0; i < 100000; ++i)
//		TestFunc2();
//	size_t end2 = clock();
//	// 计算两个函数运算完成之后的时间
//	cout << "TestFunc1 time:" << end1 - begin1 << endl;
//	cout << "TestFunc2 time:" << end2 - begin2 << endl;
//}
//int main()
//{
//		int a = 10;
//		int& ra = a;
//		ra = 20;
//		int* pa = &a;
//		*pa = 20;
//		return 0;
//}


extern "C"
{
	#include "../ds/stack.h"
}

bool isValid(char* s) {
    stack st;
    stackInit(&st);
    while (*s)
    {
        if (*s == '[' ||
            *s == '{' ||
            *s == '(')
        {
            stackPush(&st, *s);
            s++;
        }
        else
        {
            //遇到收括号了
            //但是栈里边没有数据的话，我们需要判断一下
            if (stackEmpty(&st))
            {
                stackDestroy(&st);
                return false;
            }
            datetype top = stackTop(&st);
            stackPop(&st);
            if ((*s == '}' && top != '{') ||
                (*s == ']' && top != '[') ||
                (*s == ')' && top != '('))
            {
                stackDestroy(&st);
                return false;
            }
            else
            {
                s++;
            }
        }
    }
    //判断最后栈是否为空，如果为空返回true
    //反之会false
    bool ret = stackEmpty(&st);
    stackDestroy(&st);
    return ret;
}

int main()
{
	//cout << isValid("{[]}") << endl;
	//cout << isValid("([)]") << endl;
     cout << isValid(NULL) << endl;
     cout << isValid(NULL) << endl;

	return 0;
}